package Thread;

import org.junit.Test;

import java.util.concurrent.*;

public class ThreadExecutor {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /**
         * 一个池中只有一个线程在运行，该线程永不超时，而且由于是一个线程，当有多个任务需要处理时，会将它们放置到一个无界阻塞队列中逐个处理
        * */
        //创建单线程执行器
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //执行一个任务
        Future<String> future = executorService.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                String name = Thread.currentThread().getName();
                return name + "你在想什么";
            }
        });
        //获得任务执行后的返回值
        System.out.println("当前线程名字:" + Thread.currentThread().getName() + ",线程执行器返回值:"+future.get());
        //关闭执行器
        executorService.shutdown();
    }

    @Test
    public void testNewCachedThreadPool() throws ExecutionException, InterruptedException {
        /**
         * 建立了一个线程池，而且线程数量是没有限制的(当然，不能超过Integer的最大值)，新增一个任务即有一个线程处理，或者复用之前空闲的线程，
         * 或者重新启动一个线程，但是一旦一个线程在60秒内一直处于等待状态时（也就是一分钟无事可做），则会被终止
         * */
        //创建缓存线程执行器
        ExecutorService executorService = Executors.newCachedThreadPool();
        //执行一个任务
        Future<String> future = executorService.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                String name = Thread.currentThread().getName();
                return name + "你在想什么";
            }
        });
        //获得任务执行后的返回值
        System.out.println("当前线程名字:" + Thread.currentThread().getName() + ",线程执行器返回值:"+future.get());
        //关闭执行器
        executorService.shutdown();
    }

    @Test
    public void testNewFixedThreadPool() throws ExecutionException, InterruptedException {
        /**
         * 在初始化时已经决定了线程的最大数量，若任务添加的能力超出了线程的处理能力，则建立阻塞队列容纳多余的任务
         * */
        //创建固定线程数量的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        //执行一个任务
        Future<String> future = executorService.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                String name = Thread.currentThread().getName();
                return name + "你在想什么";
            }
        });
        //获得任务执行后的返回值
        System.out.println("当前线程名字:" + Thread.currentThread().getName() + ",线程执行器返回值:"+future.get());
        //关闭执行器
        executorService.shutdown();
    }
}
